package reflect;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URISyntaxException;

/**
 * 自动调用reflect包中所有类的公开的本类自己定义的无参方法
 */
public class Test03 {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
        //相对路径中的"./"位置视运行环境而定，因此开发环境中会变化，原则上少采用。
        //File file = new File("./src/reflect");

        //实际开发中，我们通常使用类加载路径
        //下面定位的是Test03这个类所在的目录(Test03.class文件所在的目录)
        File dir = new File(
                Test03.class.getResource(".").toURI()
        );
        String path = dir.getAbsolutePath();
        System.out.println(path);
        //获取Test03.class这个目录中所有的class文件
        File[] subs = dir.listFiles(f -> f.getName().endsWith(".class"));
        for (File sub : subs) {
            String fileName = sub.getName();
            String className = fileName.substring(0, fileName.indexOf("."));
            System.out.println(className);

            Class cls = Class.forName("reflect." + className);
            Object o = cls.newInstance();
            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                if (method.getParameterCount() == 0
                        && method.getModifiers() != Modifier.PRIVATE) {
                    System.out.println("执行方法" + method.getName() + "()");
                    method.invoke(o);
                }
            }
        }
    }
}
